package main.java.tipos;

import main.java.factorias.*;
import java.util.List;

import main.java.factorias.Cadenas;
import main.java.factorias.Expresion;

public class CartaAlemania extends CartaImpl{
	
	/**
	 * @uml.property  name="tipo"
	 * @uml.associationEnd  multiplicity="(1 1)"
	 */
	private TipoDeCartaAlemania tipo;
	private static Expresion<String, CartaAlemania> expresion = new StringACartaAlemana();

	public CartaAlemania(int fuerza,String nombre,TipoDeCartaAlemania tipo) {
		super(fuerza,nombre);
		this.tipo = tipo;
	}
	
	public CartaAlemania(String s) {
		super();
		
		int fuerza=0;
		String nombre="";
		char tipoLeido;
		
		List<String> lista = Cadenas.separaElementos(s, ",");
		
		if(lista.size() != 3) {
			throw new IllegalArgumentException("Error en el número de parámetros");
		}
		
		nombre = lista.get(0);
		tipoLeido=lista.get(1).charAt(0);
		
		switch(tipoLeido){
			case 'L': tipo = TipoDeCartaAlemania.LIDERAZGO;break;
			case 'U': tipo = TipoDeCartaAlemania.UNIDADES;break;
			case 'S': tipo = TipoDeCartaAlemania.ESTRATEGIA;break;
			case 'B': tipo = TipoDeCartaAlemania.PIFIA_ALIADA;break;
			case 'A': tipo = TipoDeCartaAlemania.FUERZA_AEREA;break;
			case 'M': tipo = TipoDeCartaAlemania.MOVIMIENTO;break; 
		}
		fuerza = Integer.parseInt(lista.get(2));
		
		this.setFuerza(fuerza);
		this.setNombre(nombre);
	}
	
	
	public static Expresion<String, CartaAlemania> getExpresion() {
		return expresion;
	}

	public TipoDeCartaAlemania dameTipoDeCartaAlemania(){
		return tipo;
	}

	@Override
	public String toString() {
		return "Fuerza: "+ this.dameFuerza()+ "\t" + "Tipo:" + tipo.toString() +"\t" +"Nombre: " + this.dameNombre();
	}
	
	private static class StringACartaAlemana implements Expresion<String, CartaAlemania> {
		
		/**
		 * Constructor.
		 */
		public StringACartaAlemana() {
		}

		/**
		 * @see Function#apply(Object)
		 */
		public CartaAlemania exp(String s) {
			return new CartaAlemania(s);
		}
	}

}
